<?php
/**
 * @desc 浪驰短信服务
 * @author 陈聪
 */
namespace Service\Sms\Langchi;
defined('THINK_PATH') or exit();
use Service\Sms;

class Langchi extends Sms{
    /**
     * @desc 构造函数
     * @param array $options 缓存参数
     * @access public
     */
    public function __construct($options=array()) {
        if(empty($options)) {
            $sms_config = C('SMS_CONFIG');
            $options = isset($sms_config['Langchi'])?$sms_config['Langchi']:array();
        }
        $this->options = $options;
    }

    public function getMsgByCode($code){
        $msg_code_map = array(
            '1000'=>'当前用户已经登录（1.其他地方登录了）',
            '1002'=>'登录被拒绝（一般是账号或者密码错误',
            '2001'=>'短信发送失败',
            '2002'=>'短信库存不足',
            '2003'=>'存在无效的手机号码',
            '2008'=>'没短信加签名（一般需要在短信文本中最前面或者最后面加入【XXXX】）',
            '9002'=>'SendDate或SendTime参数不是有效日期',
            '9004'=>'参数不符合要求（输出提交参数 对照举例 看看是否参数填写错误）',
            '9099'=>'其它系统错误'
        );

        $msg = isset($msg_code_map[$code]) ? $msg_code_map[$code] : $code;
        return $msg;
    }
    /**
     * @desc 短信发送接口
     * @param array $smsInfo 手机号码|内容|时间
     * @return string
     */
    public function sendMessage($smsInfo){
        $rts = array();
        $rts['rt'] = 0;
        $rts['msg'] = '';
        $rts['return_msg'] = '';    //记录第三方接口返回提示语
        $rts['return_json']= '';    //记录第三方接口返回的结果转json的值

        $requestData = array(
            'UserID' => $this->options['UserID'],     //用户账号
            'Account' => $this->options['Account'],   //用户名
            'Password' => $this->options['Password'], //密码
            'Phones' => $smsInfo['mobile'],           //手机号
            'Content' =>  $smsInfo['content'].C('SMS_SUFFIX'),  //短信内容，一般不超过70个字，超长部分自动分段，总长不超过300个字，必须在最前面或者最后面加上【金稻田】字样
            'PostFixNum'=>'',
            'SendDate' => isset($smsInfo['date'])?$smsInfo['date']:'',     //定时发送的日期，立即发送可以不输入或者为空 格式：2015-11-29
            'SendTime' => isset($smsInfo['datetime'])?$smsInfo['datetime']:'',  //定时发送的时间，立即发送可以不输入或者为空 格式：16：25：00
        );
        $url=$this->options['api_send_msg_url'];

        $url = $url . (empty($requestData) ? '' : '?' . http_build_query($requestData));
        $response = $this->curl_get($url);

        if (strpos($response, '<?xml') === 0) {
            /*
             * 浪驰那边返回接口示例
             *  <string xmlns="http://tempuri.org/">
                    <LANZ_ROOT><ErrorNum>2008</ErrorNum><JobID></JobID><PhonesSend></PhonesSend><ErrPhones></ErrPhones></LANZ_ROOT>
                </string>
             */
            $res_arr = $this->xmlToArray($response);
            if(isset($res_arr[0])) {
                $res_arr = $res_arr[0];//多层次xml嵌套,信息在第一个元素中
                $res_arr = $this->xmlToArray($res_arr);
                $rts['return_json']= json_encode($res_arr);
                if (isset($res_arr['ErrorNum'])) {
                    if($res_arr['ErrorNum'] == 0) {
                        //0：短信发送成功
                        $rts['rt'] = 1;
                        $rts['msg'] = '发送成功';
                        $rts['return_msg'] = '';
                        $rts['return_json']= json_encode($res_arr);
                    }else {
                        $rts['rt'] = -1;
                        $rts['msg'] = '发送失败';
                        $rts['return_msg'] = $this->getMsgByCode($res_arr['ErrorNum']); //获取返回码对应的错误信息
                    }
                } else {
                    $rts['rt'] = -3;
                    $rts['msg'] = '发送失败';
                    $rts['return_json'] = (string)$res_arr;
                }
            } else {
                $rts['rt'] = -4;
                $rts['msg'] = '发送失败';
                $rts['return_msg'] = "";
                $rts['return_json']= $response;
            }
        } else {
            //处理非xml格式的返回结果,如返回缺少参数: Content。
            $rts['rt'] = -5;
            $rts['msg'] = '发送失败';
            $rts['return_msg'] = $response;
            $rts['return_json'] = $response;
        }
        return $rts;
    }

    /**
     * @desc 查询短信剩余量
     */
    public function queryAccountBalance(){
        $rts = array();
        $rts['rt'] = 0;
        $rts['msg'] = '';
        $rts['return_msg'] = '';    //记录第三方接口返回提示语
        $rts['return_json']= '';    //记录第三方接口返回的结果转json的值

        $requestData = array(
            'UserID'    => $this->options['UserID'],   //用户账号
            'Account'   => $this->options['Account'],  //用户名
            'Password'  => $this->options['Password'], //密码
        );
        $url=$this->options['api_query_balance_url']."?";
        $param_str = http_build_query($requestData);
        $url = $url.$param_str;
        $xmlStr = $this->curl_get($url);

        $res_arr = $this->xmlToArray($xmlStr);

        if (isset($res_arr['ErrorNum'])) {
            $rts['return_json']= json_encode($res_arr);
            if ($res_arr['ErrorNum'] == 0) {
                //查询成功
                $rts['rt'] = 0;
                $rts['msg'] = '查询成功';
                $rts['account_balance'] = $res_arr['Stock'];
                $rts['return_msg'] = $res_arr['Stock'];
            } else {
                $rts['rt'] = -1;
                $rts['msg'] = '查询失败';
                $rts['return_msg'] = '';
            }
        } else {
            $rts['rt'] = -2;
            $rts['msg'] = '查询失败';
            $rts['return_msg'] = '';
        }
        return $rts;
    }

    /**
     * @desc xml字符串转化成数组
     * @author 陈聪
     */
    public function xmlToArray($xml) {
        if (!$xml) {
            return false;
        }
        //将XML转为array
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $data;
    }
}